/*
 * Copyright (C) 2010 Juan José Ortilles jortilles@gmail.com
 *
 * This program is free software; you can redistribute it and/or modify it 
 * under the terms of the GNU General Public License as published by the Free 
 * Software Foundation; either version 3 of the License, or 
 * any later version.
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * 
 * See the GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along 
 * with this program; if not, write to the Free Software Foundation, Inc., 
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
 *
 */

package net.juantxu.pentaho.launcher;

import java.io.File;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Properties;

import net.juantxu.pentaho.launcher.utilidades.CargaProperties;
import net.juantxu.pentaho.launcher.utilidades.ValidaEjecutableNix;
import net.juantxu.pentaho.launcher.utilidades.ValidaEjecutableWin;

import org.apache.log4j.Logger;

/* 
 * esta clase comprueba que existan las aplicaciones donde se supone que deben estar y si no te propone buscarlas o descargarlas
 */
public class CompruebaAplicaciones {
	static Logger log = Logger.getLogger(CompruebaAplicaciones.class);
	private ArrayList<String> listaApps = new ArrayList<String>();

	/*
	 * @param pr: Recibe como parametro el properties de la aplicación esperando
	 * recibir las rutas de las aplicacioens pentaho a ejecutar Constructor de
	 * la clase.
	 */

	public boolean comprueba() {
		boolean exito = true;
		Properties pr = new CargaProperties().Carga();
		
		for (Enumeration<Object> e = pr.keys(); e.hasMoreElements();) {
			// Obtenemos el objeto
			Object obj = e.nextElement();
			// si es un path relativo
			if (obj.toString().contains("RelativePath")) {
				log.debug("revisando " + obj + ": "
						+ pr.getProperty(obj.toString()));

				if (obj.toString().length() > 1) {
					// si tiene una ubicacion
					File f = new File(pr.getProperty(obj.toString()));
					if (f.isDirectory()) {
						log.debug("es un directorio");
						if (validaEjecutables(obj.toString(), pr
								.getProperty(obj.toString())) == false) {
							log.error("No se encuentra el ejecutable");
							log.error("error grave no previsto");
							exito = false;
						}
					} else {
						log.debug("no existe, hay que actualizar");
						// if del design studio
						if ( obj.toString().equals("designStudioRelativePathNix") && getOs().equals("win") ){
							log.debug("estoy en win y valido ds para nix");
						}else if ( obj.toString().equals("designStudioRelativePathWin") && getOs().equals("nix") ){
							log.debug("estoy en nix y valido ds para win");
						}else{
						listaApps.add(obj.toString());
						}
					}
				}
			}

		}
		if (! listaApps.isEmpty()) {
			actualiza();
		}
		return exito;
	}

	private String getOs(){
		
		String os = "";
		os = System.getProperty("os.name");
		log.debug("sistema operativo :".concat(os));
		if (os.toLowerCase().contains("win")) {
			os = "win";
		} else {
			os = "nix";
		}
		return os;
	}
	public boolean validaEjecutables(String app, String path) {
		boolean exito = false;
		
		if (app.equals("metadataRelativePath")) {
			exito = valida(path + "/metadata-editor");
		} else if (app.equals("dataIntegrationRelativePath")) {
			exito = valida(path + "/spoon");
		} else if (app.equals("reportDesingerRelativePath")) {
			exito = valida(path + "/report-designer");
		} else if (app.equals("designStudioRelativePathNix")) {
			// caso especial el lanzador se llama distinto
			exito = new ValidaEjecutableNix().valida(path + "/eclipse");
		} else if (app.equals("designStudioRelativePathWin")) {
			// caso especial el lanzador se llama distinto
			exito = new ValidaEjecutableNix().valida(path + "/eclipse.exe");
		} else if (app.equals("wekaRelativePath")) {
			exito = validaWeka(path + "/weka.jar");
			// caso especial weka se lanza por comando
		} else if (app.equals("workbenchRelativePath")) {
			exito = valida(path + "/workbench");
		} else if (app.equals("biserverRelativePath")) {
			exito = valida(path + "/start-pentaho");
		} else if (app.equals("adminConsoleRelativePath")) {
			exito = valida(path + "/start-pac");
		} else if (app.equals("aggregationRelativePath")) {
			exito = valida(path + "/startaggregationdesigner");
		}
		return exito;
	}

	/*
	 * Valida los ejecutables para win y para nix. Espera que se llamen igual
	 * 
	 * @param ejecutable path al ejecutable sin el .bat o .sh
	 */
	private boolean valida(String ejecutable) {

		boolean exito = false;
		if (getOs().equals("nix")) {
			log.debug("validando" + ejecutable + ".sh");
			exito = new ValidaEjecutableNix().valida(ejecutable + ".sh");
		} else {
			log.debug("validando" + ejecutable + ".bat");
			exito = new ValidaEjecutableWin().valida(ejecutable + ".bat");
		}
		log.info(ejecutable + "es ejecutable.... bien.");
		return exito;
	}

	private boolean validaWeka(String ejecutable) {

		boolean exito = false;
		if (getOs().equals("nix")) {
			log.debug("validando" + ejecutable );
			exito = new ValidaEjecutableNix().valida(ejecutable );
		} else {
			log.debug("validando" + ejecutable );
			exito = new ValidaEjecutableWin().valida(ejecutable );
		}
		log.info(ejecutable + "es ejecutable.... bien.");
		return exito;
	}
	
	/*
	 * Aqui actualizo la ruta a las app o propongo descargarlas.
	 */
	private void actualiza() {
		log.debug("abriendo el dialogo para actualizar al aplicación ");
		ActualizadorGUI act = new ActualizadorGUI(null, listaApps);
		act.setVisible(true);
		//act.setModal(true);
		act.setLocation(100, 100);
	}
}
